package com.ftg.product.controller;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.ftg.product.entity.Student;
import com.mysql.cj.jdbc.MysqlDataSource;
import com.mysql.cj.xdevapi.JsonArray;
import com.sun.media.sound.SoftTuning;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.lang.reflect.Type;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;

/**
 * @author kangjx
 * @createTime 2022/9/6
 */
@RestController
public class DemoController {

    @Autowired
    @Qualifier("mysqlTemplate")
    JdbcTemplate jdbcTemplate;

    @Autowired
    StringRedisTemplate stringRedisTemplate;


    @GetMapping("/get/{key}")
    public String getString(@PathVariable("key") String key){
         return stringRedisTemplate.opsForValue().get(key);
    }

    // redis 是为了代替mybatis 一级缓存 二级缓存
    @GetMapping("/jdbcshow")
    public String jdbc(){
        //杨剑  :  80 api  第一次访问的时候 ，redis没有任何数据，所以所有线程都会查询数据库，数据压力增加 ， tomcat  down
//        redis 第一次使用的时候有数据 数据预热
        // 第一次慢  数据预热  80 api所有查询 redis里面存在大量数据 过期时间全是一天.明天这个时间段所有数据全部从redis里失效（过期）.

        String json = stringRedisTemplate.opsForValue().get("yj_student_jdbc");
        System.out.println(json);
        if(Objects.isNull(json)){
            System.out.println("redis没有命中,我要查询数据库");
            List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from student");
            String listString = JSONArray.of(list).toJSONString();
            //数据不能永远存在 redis 内存会满
            stringRedisTemplate.opsForValue().set("yj_student_jdbc",listString,1,TimeUnit.DAYS);
            return listString;
        }else{
            System.out.println("redis命中,直接返回 redis里面数据");
            return json;
        }

    }
    //把json字符串 转换成为指定的java类型
    @GetMapping("/jdbcshow1")
    public List<Student>  jdbcForPojo(){
        String json = stringRedisTemplate.opsForValue().get("yj_student_jdbc");
        if(Objects.isNull(json)){
            //jdbctemplate 查询返回 list<Pojo> -> query  new BeanPropertyRowMapper ()转换
            List<Student> list = jdbcTemplate.query("select sno,sname,sage,ssex from student", new BeanPropertyRowMapper<>(Student.class));
            String str = JSON.toJSONString(list);
            //数据不能永远存在 redis 内存会满
            stringRedisTemplate.opsForValue().set("yj_student_jdbc",str,1,TimeUnit.DAYS);
            return list;
        }else{
            JSONArray a = JSON.parseArray(json);
            System.out.println(a);
            List<Student> list1 = a.toJavaList(Student.class);
            System.out.println("redis命中,直接返回 redis里面数据");
            return list1;
        }
    }

    @GetMapping("/set")
    public String setString(@RequestParam("key") String key, @RequestParam("value")String value){
        stringRedisTemplate.opsForValue().set(key,value,3, TimeUnit.DAYS);
        return "success";
    }


//    @PostMapping("/save")
//    @Transactional(rollbackFor = Exception.class)
//    public boolean saveStudent(@RequestBody Student stu) throws SQLException {
//
//        String sql = "insert into student(sno,sname,sage,ssex) values(?,?,?,?)";
//        int num = jdbcTemplate.update(sql,stu.getSno(),stu.getSname(),stu.getSage(),stu.getSsex());
//        if(num > 0){
//            stringRedisTemplate.delete("yj_student_jdbc");
//        }
//        return num > 0 ? true : false;
//    }

    @GetMapping("/save")
    @Transactional(rollbackFor = Exception.class)
    public boolean saveStudent(
            @RequestParam("sno")String sno,
            @RequestParam("sname")String sname,
            @RequestParam("sage")int sage,
            @RequestParam("ssex")String ssex
       ) throws SQLException {

        String sql = "insert into student(sno,sname,sage,ssex) values(?,?,?,?)";
        int num = jdbcTemplate.update(sql,sno,sname,sage,ssex);
        if(num > 0){
            stringRedisTemplate.delete("yj_student_jdbc");
        }
        return num > 0 ? true : false;
    }





}
